package com.negotium.presentacion.web.security;

import org.acegisecurity.GrantedAuthority;
import org.acegisecurity.GrantedAuthorityImpl;
import org.acegisecurity.userdetails.User;
import org.acegisecurity.userdetails.UserDetails;
import org.acegisecurity.userdetails.UserDetailsService;
import org.acegisecurity.userdetails.UsernameNotFoundException;
import org.springframework.dao.DataAccessException;

import com.negotium.dominio.Usuario;
import com.negotium.dominio.dao.UsuarioDAO;
import com.negotium.presentacion.web.commons.Const;

/**
 * <p>
 * Implementa el servicio para obtener los usuarios registrados en la base.
 * </p>
 * 
 * <p>
 * Esta clase es utilizada por el framework Acegi para obtener los usuarios
 * registrados en el sistema.
 * </p>
 */
public class UserDetailsServiceImpl implements UserDetailsService {

	private UsuarioDAO usuarioDAO;
	
	public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException, DataAccessException {
		Usuario usuario = usuarioDAO.findByUserName(userName);
		if (usuario == null) {
			throw new UsernameNotFoundException("El username indicado no existe.");
		}
		
		User user = new User(usuario.getUserName(),usuario.getPassword(),true,true,true,true,this.getAuthorities());
		return user;
	}
	
	private GrantedAuthority[] getAuthorities() {
		GrantedAuthority[] authorities = new GrantedAuthority[1];
		authorities[0] = new GrantedAuthorityImpl(Const.ROLE_USER);
		return authorities;
	}

	public UsuarioDAO getUsuarioDAO() {
		return usuarioDAO;
	}

	public void setUsuarioDAO(UsuarioDAO usuarioDAO) {
		this.usuarioDAO = usuarioDAO;
	}

}
